﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Windows.Forms;
using System.Drawing;
using System.Threading;
using System.ComponentModel;
using System.IO;
using VisionEstereo.AlgoritmoCorrelacion;

namespace VisionEstereo
{
	// Clase privada para representar los argumentos del algoritmo
	class ArgsImagenes3
	{
		private Bitmap bitmapIzquierda;
		private Bitmap bitmapDerecha;
		// Los parámetros
		private Object parametros;
		
		public ArgsImagenes3(Bitmap bitmapIzquierda, Bitmap bitmapDerecha, Object parametros)
		{
			this.bitmapIzquierda = bitmapIzquierda;
			this.bitmapDerecha = bitmapDerecha;
			this.parametros = parametros;
		}
		
		// Propiedades
		public Bitmap BitmapIzquierda
		{
			get
			{
				return bitmapIzquierda;
			}
			set
			{
				this.bitmapIzquierda = value;
			}
		}
		
		public Bitmap BitmapDerecha
		{
			get
			{
				return bitmapDerecha;
			}
			set
			{
				this.bitmapDerecha = value;
			}
		}
		
		public Object Parametros
		{
			get
			{
				return parametros;
			}
			set
			{
				this.parametros = value;
			}
		}
	}
	
    public partial class SeleccionImagenesCorrelacion
    {
		// Atributos (imágenes)
		private Bitmap bitmapIzquierda;
		private Bitmap bitmapDerecha;
        private int[,] mapaDisparidades, mapaClases;

		// Atributos (tipo de algoritmo)
		private App.TipoAlgoritmo tipoAlgoritmo;
		
		// Atributos (parámetros del algoritmo)
		private Object parametrosAlgoritmo;
		
		
        public SeleccionImagenesCorrelacion()
        {
            this.InitializeComponent();

            // Insert code required on object creation below this point.
        }

        public SeleccionImagenesCorrelacion(App.TipoAlgoritmo tipoAlgoritmo, Object parametrosAlgoritmo)
		{
			this.InitializeComponent();
			this.tipoAlgoritmo = tipoAlgoritmo;
			this.parametrosAlgoritmo = parametrosAlgoritmo;
		}

        private void cargarImagenIzquierda_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            // Abrimos un cuadro de diálogo
            OpenFileDialog dialogoAbrir = new OpenFileDialog();
            dialogoAbrir.Filter = "Archivos de imagen|*.jpg;*.png;*.bmp";
            dialogoAbrir.Title = "Seleccione la imagen izquierda";
			
            if (dialogoAbrir.ShowDialog() == DialogResult.OK)
            {
				
                char[] myChar = { '.', 'j', 'p', 'g' };
                string nombreFich = dialogoAbrir.FileName.TrimEnd(myChar);
                if (!File.Exists(nombreFich + "_mapaDisparidad.txt")){

                    MensajeError error = new MensajeError();
			    	error.WindowStartupLocation = WindowStartupLocation.CenterScreen;
				    error.setMensajeError("Debe seleccionar una imagen de disparidad.");
				    error.ShowDialog();
                }
                else{
                    bitmapIzquierda = new Bitmap(dialogoAbrir.FileName);
                    this.imagenIzquierda.Fill = new ImageBrush(new BitmapImage(new Uri(dialogoAbrir.FileName)));
                    StreamReader fichero = new StreamReader(nombreFich + "_mapaDisparidad.txt");
                
                
                    mapaDisparidades = new int[this.bitmapIzquierda.Width, this.bitmapIzquierda.Height];
                    rellenaMapa(this.mapaDisparidades, fichero,false);
                }
            }
        }

        private void rellenaMapa(int[,] p, StreamReader fichero,bool b)
        {
            int limit_Width;
            int limit_Height;
            if (b)
            {
                limit_Width = this.bitmapDerecha.Width;
                limit_Height = this.bitmapDerecha.Height;
            }

            else
            {
                limit_Width = this.bitmapIzquierda.Width;
                limit_Height = this.bitmapIzquierda.Height;
            }
            for (int i = 0; i < limit_Width; i++)
            {
                for (int j = 0; j < limit_Height; j++)
                {
                    p[i, j] = Convert.ToInt16(fichero.ReadLine());
                }
            }
        }

        private void cargarImagenDerecha_Click(object sender, System.Windows.RoutedEventArgs e)
        {
        	// Abrimos un cuadro de diálogo
            OpenFileDialog dialogoAbrir = new OpenFileDialog();
            dialogoAbrir.Filter = "Archivos de imagen|*.jpg;*.png;*.bmp";
            dialogoAbrir.Title = "Seleccione la imagen derecha";
			
            if (dialogoAbrir.ShowDialog() == DialogResult.OK)
            {
				
                char[] myChar = { '.', 'j', 'p', 'g' };
                string nombreFich = dialogoAbrir.FileName.TrimEnd(myChar);
                if (!File.Exists(nombreFich + "_mapaClases.txt"))
                {

                    MensajeError error = new MensajeError();
                    error.WindowStartupLocation = WindowStartupLocation.CenterScreen;
                    error.setMensajeError("Debe seleccionar una imagen segmentada.");
                    error.ShowDialog();
                }
                else
                {
                    bitmapDerecha = new Bitmap(dialogoAbrir.FileName);
                    this.imagenDerecha.Fill = new ImageBrush(new BitmapImage(new Uri(dialogoAbrir.FileName)));
                    StreamReader fichero = new StreamReader(nombreFich + "_mapaClases.txt");

                    mapaClases = new int[this.bitmapDerecha.Width, this.bitmapDerecha.Height];
                    
                    rellenaMapa(this.mapaClases, fichero, true);
                }
            }
        }

        private void botonSiguiente_Click(object sender, System.Windows.RoutedEventArgs e)
        {
        	// Validamos que el usuario haya cargado las dos imágenes
			if (this.imagenDerecha.Fill.Equals(System.Windows.Media.Brushes.White)  || this.imagenIzquierda.Fill.Equals(System.Windows.Media.Brushes.White))
			{
				MensajeError error = new MensajeError();
				error.WindowStartupLocation = WindowStartupLocation.CenterScreen;
				error.setMensajeError("Debe seleccionar las imágenes antes de continuar.");
				error.ShowDialog();
			}
			else
			{
                AlgoritmoCorrelacion.AlgCorrelacion correlacion= new AlgoritmoCorrelacion.AlgCorrelacion();
                Bitmap Result = correlacion.EjecutarAlgCorrelacion(bitmapIzquierda, bitmapDerecha,mapaDisparidades,mapaClases);
                ResultadosCorrelacion paginaResult = new ResultadosCorrelacion();
                System.Windows.Media.Imaging.BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(Result.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
                paginaResult.setImagenResultado(bitmapSource);
                paginaResult.setImagenInicial(bitmapIzquierda);
                paginaResult.setTamañoImagenReal(bitmapIzquierda.Size.Width, bitmapIzquierda.Size.Height);
                paginaResult.setMapaDisparidades(mapaDisparidades);
                
                this.NavigationService.Navigate(paginaResult);

			}
		}
			
	}
}